#include <iostream>
using namespace std;

// 动物类
class Animal{
    protected:
        string name;    // 名字
        int legs;       // 腿的数量
    public:
        Animal(){}
        Animal(string n, int l):name(n), legs(l){}
        ~Animal(){}
        // 声明了一个纯虚函数
        virtual void eat() = 0; // 有纯虚函数的类 我们就叫做抽象类
};

// 老虎类
class Tiger:public Animal{
    private:
        string color;
    public:
        Tiger(){}
        Tiger(string n, int l, string c):Animal(n, l), color(c){}
        ~Tiger(){}
        // 子类中必须重写父类的纯虚函数
        void eat(){
            cout << "老虎吃肉" << endl;
        }
};

// 羊类
class Sheep:public Animal{
    private:
        int corner; // 犄角数量
    public:
        Sheep(){}
        Sheep(string n, int l, int c):Animal(n, l), corner(c){}
        ~Sheep(){}
        // 子类中必须重写父类的纯虚函数
        void eat(){
            cout << "羊吃草" << endl;
        }
};

// 抽象类的引用 引用子类对象
void animal_eat_1(Animal &x){
    x.eat();
}

// 抽象类的指针 指向子类对象
void animal_eat_2(Animal *x){
    x->eat();
}

int main(int argc, const char *argv[]){
    // 抽象类不能实例化对象 因为抽象类实例化的对象没意义
    // Animal a1("动物", 6); // 报错

    Tiger t1("泰哥", 4, "黄色");
    Sheep s1("喜羊羊", 4, 2);

    animal_eat_1(t1);
    animal_eat_1(s1);

    cout << "-----------------" << endl;

    animal_eat_2(&t1);
    animal_eat_2(&s1);

    return 0;
}